/*
    1. 任意路由切换时实现进度条 --nprogress
    2. 路由鉴权：项目路由能否被访问的权限
        用户未登录：只能访问login
        用户登录成功： 访问login -> 指向首页，其余路由可以访问
    3. 根据路由，修改标签页的title
*/
// 路由守卫

import router from './router'
import setting from './setting'
// 进度条插件
import nprogress from 'nprogress'
// 进度条样式
import 'nprogress/nprogress.css'
// 取消进度条右侧的加载小圆圈
nprogress.configure({ showSpinner: false })
// 引入user小仓库（获取token，判断是否登录 / 获取用户信息）
import pinia from './store' // 在组件外获取pinia（pinia还未加载）
import useUserStore from './store/modules/user'
let userStore = useUserStore(pinia)
let count = 0
// 全局守卫：项目任意路由切换都会触发的钩子
// 全局前置守卫
router.beforeEach(async (to, from, next) => {
  document.title = `${setting.title} - ${to.meta.title}`
  /*
    to: 将要访问的路由对象
    from: 跳转前的路由对象
    next: 路由的放行函数
    */
  // 访问路由前的操作
  // 获取token,判断用户是否登录
  let token = userStore.token
  // 获取用户信息
  let username = userStore.username
  // 用户已登录
  if (token) {
    // 访问login,跳转到首页
    if (to.path == '/login') next('/')
    // 其他路由,放行
    else {
      // 有用户信息,直接放行
      if (username) next()
      // 没有用户信息
      else {
        // 获取用户信息后放行
        try {
          await userStore.userInfo()
          // 异步路由刷新时，获取到用户信息，但还未加载异步路由
          // {...to}保证加载路由后再放行
          next({ ...to })
        } catch (error) {
          // token过期 | 用户手动修改本地存储token
          // 退出登录(清空用户数据
          await userStore.userLogout()
          // 跳转到login登录页面
          next({
            path: '/login',
            query: { redirect: to.path },
          })
        }
        next()
      }
    }
  } // 用户未登录
  else {
    // 访问login,不需要再跳转,否则死循环
    if (to.path == '/login') next()
    // 其他路由: 跳转到login
    else
      next({
        path: '/login',
        query: { redirect: to.path },
      })
  }
  // 启动进度条
  nprogress.start()
})

// 全局后置守卫
router.afterEach((to, from) => {
  // 结束进度条
  nprogress.done()
})
